package com.xdhl.fu.fim.price.strategy;

import com.xdhl.fu.flight.info.api.domain.FlightInfo;
import com.xdhl.fu.flight.info.api.domain.FlightSchedule;

/**
 * 价格计算策略
 *
 * @author 朱力维
 * @time 2022/6/1 20:28
 */
public interface PriceCalcStrategy extends Comparable<PriceCalcStrategy> {

    /**
     * 排序
     *
     * @return 排序
     */
    int order();

    /**
     * 计算方法调用
     *
     * @param flightInfo 航班信息
     * @param schedule   航班排班信息
     */
    default void calc(FlightInfo flightInfo, FlightSchedule schedule) {
        if (enable(flightInfo, schedule)) {
            this.calcEconomy(flightInfo, schedule).calcBusiness(flightInfo, schedule).calcHeader(flightInfo, schedule);
        }
    }

    /**
     * 排序方法
     *
     * @param o 计算策略
     * @return 排序
     */
    default int compareTo(PriceCalcStrategy o) {
        return this.order() - o.order();
    }

    /**
     * 计算经济舱价格
     *
     * @param flightInfo 航班信息
     * @param schedule   航班排班信息
     */
    PriceCalcStrategy calcEconomy(FlightInfo flightInfo, FlightSchedule schedule);

    /**
     * 计算商务舱价格
     *
     * @param flightInfo 航班信息
     * @param schedule   航班排班信息
     */
    PriceCalcStrategy calcBusiness(FlightInfo flightInfo, FlightSchedule schedule);

    /**
     * 计算头等舱价格
     *
     * @param flightInfo 航班信息
     * @param schedule   航班排班信息
     */
    PriceCalcStrategy calcHeader(FlightInfo flightInfo, FlightSchedule schedule);

    /**
     * 是否启用
     *
     * @param flightInfo 航班信息
     * @param schedule   航班排班信息
     * @return 是否启用
     */
    boolean enable(FlightInfo flightInfo, FlightSchedule schedule);

}
